package com.zyasdk.controll;

import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo.State;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;

import com.zhuoyian.analysis.Analysis;
import com.zhuoyian.analysis.AnalysisBuilder;
import com.zhuoyian.analysis.AnalysisBuilder.DownLoadState;
import com.zhuoyian.analysis.AnalysisBuilder.OpenManner;
import com.zhuoyian.analysis.common.AnalysisConsts;
import com.zyasdk.WU;
import com.zyasdk.Zservice;
import com.zyasdk.enums.AdType;
import com.zyasdk.enums.KVType;
import com.zyasdk.enums.SDKActionType;
import com.zyasdk.enums.ShowAdType;
import com.zyasdk.model.ARModel;
import com.zyasdk.model.NewsPortal;
import com.zyasdk.model.Products;
import com.zyasdk.service.ActivatesService;
import com.zyasdk.service.NewsService;
import com.zyasdk.util.ApkControll;
import com.zyasdk.util.AppInfoUtil;
import com.zyasdk.util.CurrRunApp;
import com.zyasdk.util.DateHelper;
import com.zyasdk.util.ZYALogUtils;
import com.zyasdk.util.LocalUtils;
import com.zyasdk.util.NewsUtil;
import com.zyasdk.util.NewsUtil.NewsResultCallBackListener;
import com.zyasdk.util.NotifiUtil;
import com.zyasdk.util.SDKActionRecordUtil;
import com.zyasdk.util.SP;
import com.zyasdk.util.StaticSetting;

import java.util.List;
import java.util.Random;

@SuppressLint("HandlerLeak")
public class ShowUtil {
	private static ShowUtil su;
	public static boolean isShowAd = false; //不自动弹广告，由服务器统一控制

	public static ShowUtil getModel() {
		if (su == null)
			su = new ShowUtil();
		return su;
	}

	private Context context;

	public void init(String action, Intent intent, Context context) {
		this.context = context;
		if (action.equals("com.zyasdk.zservice.timetask")) {
			// 定时任务
			appCount();
		} else if (action.equals("com.zyasdk.zservice.startcommand")) {
			ZYALogUtils.e("service startcommand");
		} else if (action.equals("com.zyasdk.zservice.destroy")) {
			ZYALogUtils.e("service destroy");
			// 服务被销毁之后重启服务
			context.startService(new Intent(context, Zservice.class));
		} else if (action.equals(Intent.ACTION_TIME_TICK)) {
			// 计时器（1分钟通知一次）
			timeLine();
		} else if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
			ZYALogUtils.e("headset plug");
			// 插拔耳机
			countChange(ShowAdType.HEADSET_PLUG);
		} else if (action.equals(Intent.ACTION_PACKAGE_ADDED)
				|| action.equals(Intent.ACTION_PACKAGE_REPLACED)) {
			ZYALogUtils.e("package added");
			// 应用安装
			countChange(ShowAdType.APP_ADDED);
			// 获取安装的包名
			String packageName = intent.getDataString().replace("package:", "");
			// 验证是不是安装的产品包
			checkPackage(packageName);
			/*
			// 执行应用安装卸载推广操作
			countChange(ShowAdType.RECOMMEND,
					"A Application Installed Successful");
			*/
		} else if (action.equals(Intent.ACTION_PACKAGE_REMOVED)) {
			ZYALogUtils.e("package removed");
			// 应用卸载
			countChange(ShowAdType.APP_REMOVED);
			/*
			// 执行应用安装卸载推广操作
			countChange(ShowAdType.RECOMMEND,
					"A Application Uninstallation Successful");
			*/
		} else if (action.equals(Intent.ACTION_USER_PRESENT)) {
			ZYALogUtils.e("user present");
			// 解锁
			countChange(ShowAdType.UNLOCK);
		} else if (action.equals(Intent.ACTION_CAMERA_BUTTON)) {
			ZYALogUtils.e("camera button");
			// 用户拍照
			countChange(ShowAdType.CAMERA_BUTTON);
		} else if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
			ZYALogUtils.e("download complete");
			// 包下载完成
			countChange(ShowAdType.DOWNLOADC);
		} else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
			ZYALogUtils.e("boot completed");
		} else if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
			ZYALogUtils.e("power connected");
			// 插上外部电源
			countChange(ShowAdType.POWER_CONNECTED);
		} else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
			ZYALogUtils.e("configuration changed");
			// 设置更改
			countChange(ShowAdType.CONFIGURATION_CHANGED);
		} else if (action.equals("android.net.conn.CONNECTIVITY_CHANGE")) {
			ZYALogUtils.e("net changed");
			// 网络状态切换
			netChanged();
		} else if (action.equals(NotifiUtil.ZYANOTIFI_ACTION)) {
			int type = intent.getIntExtra(NotifiUtil.ZYANOTIFI_TYPE, -1);
			if (type == NotifiUtil.NOTIFI_TYPE_NEWS) {
				// 获取通知栏点击的新闻
				NewsPortal np = (NewsPortal) intent
						.getParcelableExtra(NotifiUtil.ZYANOTIFI_NAME);
				if (np != null) {
					Uri uri = Uri.parse(np.getURL());
					// 默认打开自家浏览器
					boolean result = ApkControll.openApp(context,
							"com.zhuoyian.horsemarket110110", uri);
					if (!result) {
						// 如果自家浏览器打开失败则打开默认浏览器
						intent = new Intent(Intent.ACTION_VIEW, uri);
						intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
						context.startActivity(intent);
					}
				}
				String head=np.getHeader();
				if(head!=null&&head.length()>11){
					head=head.substring(0, 10);
				}
		        Analysis.getBrowserAnalysis().analysisClick(AnalysisConsts.SCENE_NEWS, head,""+OpenManner.NOTIFY.getValue(),null);
			} else if (type == NotifiUtil.NOTIFI_TYPE_PRODUCT) {
				// 获取通知栏点击的产品
				Products product = (Products) intent
						.getSerializableExtra(NotifiUtil.ZYANOTIFI_NAME);
				// 直接调用下载功能
				if (product != null){
					
				WindowUtil.getModel(context).download(product);
				
		        AnalysisBuilder ab=AnalysisBuilder.create().putApkId(product.getId()).putApkName(product.getName())
		        		.putApkUrl(product.getApkfile()).putOpen(OpenManner.NOTIFY).putExitTime()
		        		.putState(DownLoadState.CLICK).putComeTime(""+System.currentTimeMillis());
		        Analysis.getBrowserAnalysis().analysisDownload(AnalysisConsts.SCENE_DOWNLOAD, "0", "0",ab);
				}

			}
		}
	}

	/**
	 * 验证安装的包
	 * 
	 * @param packageName
	 */
	private void checkPackage(String packageName) {
		String[] data = LocalUtils.getLocalPackname(context);
		if (data == null || data.length == 0)
			return;
		Products product = LocalUtils.getProductsByPackName(context,
				packageName);
		if (product != null) {
			// 下载完成后统计
			SDKActionRecordUtil.AddRecord(context, product.getId(),
					SDKActionType.INSTALL);
		}
		try {
        for (String pn : data) {
            if (pn.equals(packageName)) {
                // 如果当前安装的应用是下载的应用则直接打开应用用来激活
                ApkControll.openApp(context, packageName);
                // 下载完成后统计
                SDKActionRecordUtil.AddRecord(context, product.getId(),
                		SDKActionType.ACTIVATE);
            }
        }
  } catch (Exception e) {
							e.printStackTrace();
		}
	}

	/**
	 * 网络状态改变
	 */
	private void netChanged() {
		State wifiState = null;
		State mobileState = null;
		ConnectivityManager cm = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
		mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
				.getState();
		if (wifiState != null && mobileState != null
				&& State.CONNECTED != wifiState
				&& State.CONNECTED == mobileState) {
			// 手机网络连接成功
			ZYALogUtils.e("mobile net");
			countChange(ShowAdType.NETWORK_CHANGED);
			DLTask.stop();
		} else if (wifiState != null && mobileState != null
				&& State.CONNECTED != wifiState
				&& State.CONNECTED != mobileState) {
			// 手机没有任何的网络
			ZYALogUtils.e("not net");
			DLTask.stop();
		} else if (wifiState != null && State.CONNECTED == wifiState) {
			// 无线网络连接成功
			ZYALogUtils.e("wifi net");
			countChange(ShowAdType.NETWORK_CHANGED);
			// 开启本地下载任务
			DLTask.start(context);
		}
	}

	/**
	 * 次数判定
	 * 
	 * @param type
	 */
	private void countChange(ShowAdType type) {
		countChange(type, null);
	}

	/**
	 * 次数判定
	 * 
	 * @param type
	 * @param mess
	 */
	private void countChange(ShowAdType type, String mess) {
		long count = SP.getLong(context, type.getCountKey());
		if (count == 0) {
			// 初次打开或应用被重置后设置默认次数
			count = (type.getMaxCount() + type.getMinCount()) / 2;
			SP.put(context, type.getCountKey(), count);
		}
		long index = SP.getLong(context, type.getIndexKey());
		if (index == count) {
			if (type == ShowAdType.RECOMMEND) {
				new WU(context).showRecommend(mess);
			} else {
				showAd(type);
			}
			// 广告弹出完成之后设置下次激活次数(MAX-MIN+1)+MIN
			int next_count = new Random().nextInt(type.getMaxCount()
					- type.getMinCount() + 1)
					+ type.getMinCount();
			SP.put(context, type.getCountKey(), next_count);
			// 广告弹出完成之后重置激活次数
			SP.put(context, type.getIndexKey(), 0);
		} else {
			SP.put(context, type.getIndexKey(), ++index);
		}
	}

	/**
	 * APP打开次数判定
	 */
	private void appCount() {
		ShowAdType type = ShowAdType.OPENAPP;
		// 获取当前运行的应用包名
		String packageName = CurrRunApp.getForegroundApp(context);
		if (TextUtils.isEmpty(packageName))
			return;
		String currPackage = SP.get(context, type.getNameKey());
		if (TextUtils.isEmpty(currPackage)) {
			// 如果本地没有应用包名则先重置包名
			SP.put(context, type.getNameKey(), packageName);
		} else {
			// 只有当前打开的应用与上次打开的应用不相同时才进行判定
			if (!packageName.equals(currPackage)) {
				// 判断是否是浏览器
				/*if (AppInfoUtil.isBrowser(context, packageName)) {
					Uri content_url = Uri
							.parse("http://4gpal.com/?p=oversea209");
					ApkControll.openApp(context, packageName, content_url);
				}
				long index = SP.getLong(context, type.getIndexKey());
				long count = SP.getLong(context, type.getCountKey());
				if (count == 0) {
					// 如果本地没有保存次数则直接用用平均值
					count = (type.getMinCount() + type.getMaxCount()) / 2;
				}
				// 如果应用打开次数已经符合则直接弹出广告
				if (index == count) {
					showAd(type);
					// 广告弹出完成之后设置下次APP打开次数(MAX-MIN+1)+MIN
					int next_count = new Random().nextInt(type.getMaxCount()
							- type.getMinCount() + 1)
							+ type.getMinCount();
					SP.put(context, type.getCountKey(), next_count);
					// 广告弹出完成之后重置APP打开下标
					SP.put(context, type.getIndexKey(), 0);
				} else {
					// 如果当前打开的应用与之前打开的应用不相同则累计次数
					SP.put(context, type.getIndexKey(), ++index);
					SP.put(context, type.getNameKey(), packageName);
				}*/
			}
		}
	}

	/**
	 * 时间差判定
	 * 
	 * @param
	 */
	private void timeLine() {
		// 每次时间改变的时候判断服务是否还在运行，如果没有在运行则启动服务
		if (!AppInfoUtil.isServiceWork(context, "com.zyasdk.Zservice")) {
			context.startService(new Intent(context, Zservice.class));
		}
		ShowAdType type = ShowAdType.ACTIVATE_UPDATE;
		DateHelper dh = DateHelper.getInstance();
		String time = SP.get(context, type.getIndexKey());
		if (TextUtils.isEmpty(time)) {
			// 如果本地没有保存活跃时间则保存当前时间为活跃时间并执行活跃请求
			SP.put(context, type.getIndexKey(), dh.getDataString_1(null));
			ZYALogUtils.e("first Activates");
			AAU();
		}
		long mill = dh.getDifference(time, dh.getDataString_1(null));
		//if (mill >= type.getMaxCount()) {
		if (mill >= 15*24*60*60*1000) { //15天
			ZYALogUtils.e("exe Activates " + mill);
			// 间隔时间到了激活一次
			AAU();
			// 进行一次激活更新之后设置时间
			SP.put(context, type.getIndexKey(), dh.getDataString_1(null));
		}

		type = ShowAdType.TIMELINE;

		String time1 = SP.get(context, type.getNameKey());
		if (TextUtils.isEmpty(time1)) {
			// 如果本地没有保存时间先重置一次本地时间
			resetTime(ShowAdType.TIMELINE);
		} else {
			mill = dh.getDifference(time1, dh.getDataString_1(null));
			if (mill >= type.getMaxCount()) {
				// 间隔时间到了之后弹出一波广告
				showAd(type);
			}
		}
		// 新闻通知判定
		type = ShowAdType.NEWS;
		time1 = SP.get(context, type.getNameKey());
		if (TextUtils.isEmpty(time1)) {
			// 如果本地没有保存时间先重置一次本地时间
			resetTime(ShowAdType.NEWS);
		}
		mill = dh.getDifference(time1, dh.getDataString_1(null));
		if (mill >= type.getMaxCount(context)) {
			resetTime(ShowAdType.NEWS);
			// 获取服务器配置的开关数据
			new NewsService(context).GetNewsLock(new Handler() {
				@Override
				public void handleMessage(Message msg) {
					Log.i("result", "handleMessage + ShowUtil"+msg.what);
					switch (msg.what) {
					case StaticSetting.RESULT_OK:
						ARModel model = (ARModel) msg.getData()
								.getSerializable("result");
						// 获取新闻内容
						loadNews(model.getReusltContent());
						break;
					case StaticSetting.RESULT_ERROR:
						ZYALogUtils.e("news error");
						break;
					}
					super.handleMessage(msg);
				}

			}, KVType.PACKAGEKEY.getValue(context), KVType.CHANNELKEY
					.getValue(context), KVType.PACKID.getValue(context),
					AppInfoUtil.getLanguage(context), KVType.PBINDKEY
							.getValue(context));

		}
	}

	/**
	 * 获取新闻
	 * 
	 * @param content
	 */
	private void loadNews(String content) {
		// -1表示不可以进行新闻推送
		if (!TextUtils.isEmpty(content) && !content.equals("-1")) {
			ZYALogUtils.e("load news "+content);
			// 间隔时间到了之后弹出一条新闻
			NewsUtil.getData(context, new NewsResultCallBackListener() {

				@Override
				public void callback(List<NewsPortal> newsList) {
					if (newsList != null && newsList.size() > 0) {
						// 获取到新闻之后推送第一条新闻
						NotifiUtil.getInstance(context).notifiNews(
								newsList.get(0));
					}
				}
			});
		}
		// 设置新闻推送间隔时间
		KVType.NEWSINTERVAL.setValue(context, content);
	}

	/**
	 * 激活 and 更新
	 */
	private void AAU() {
		ZYALogUtils.e("time activate");
		// 激活
		new ActivatesService(context).AddActivates(
				Integer.parseInt(KVType.PACKID.getValue(context)),
				KVType.PBINDKEY.getValue(context));
	}

	/**
	 * 重置本地存储时间
	 * 
	 * @param type
	 */
	private void resetTime(ShowAdType type) {
		SP.put(context, type.getNameKey(), DateHelper.getInstance()
				.getDataString_1(null));
		ZYALogUtils.e("reset "+type+" time");
	}

	/**
	 * 来弹一波广告吧
	 */
	private void showAd(ShowAdType type) {
		if (isShowAd) {
			AdType adType = new Random().nextInt(100000) % 2 == 0 ? AdType.AD
					: AdType.NOTIFIS;
			WindowUtil.getModel(context).showAd(adType);
			// 弹出一次广告后重置时间
			resetTime(ShowAdType.TIMELINE);
		}
	}

}
